package com.yuw.function;

public class TestDriver02 {
    public static void main(String[] args) {
        // 主方法调用
        //test01(); // 溢出的递归调用，先注释掉
        System.out.println("------------------------------------------------");
        test02();
    }

    /*
    斐波那契数列：给定前两项的值，从第三项开始，后面每项的值是前面两项的和；例如：
                        1 1 2 3 5 8 13 21 34 55 ...
     */

    /**
     * 斐波那契数列第n项值求解
     */
    public static void test02() {
        // 给定求解的项数
        int n = 50;
        // 统计运算时间
        // 开始时间毫秒数
        long begin = System.currentTimeMillis();
        long num = getF(n);
        // 结束时间毫秒数
        long end = System.currentTimeMillis();
        System.out.println("斐波那契数列第" + n + "项的值：" + num);
        System.out.println("递归运算花费的时间：" + ((end - begin) / 1000) + "秒");
    }

    /**
     * 使用递归求解斐波那契数列第n项的值
     *
     * @param n 求解的第几项
     * @return 该项的值
     */
    public static long getF(int n) {
        // 递归结束条件
        if (n == 1 || n == 2) {
            return 1;
        }

        // 自己调用自己
        return getF(n - 2) + getF(n - 1);
    }


    ////////////////////////////////////////////////////////////////////////
    public static void test01() {
        System.out.println("方法在执行");
        // 调用自身
        test01(); // 会构成死循环
        // 如果递归方法没有结束条件就是死循环
    }
}
